import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

const instance = axios.create({
  baseURL: 'http://toutiao.itheima.net', //设置及地址
  timeout: 10000 //设置网络超时，超过10s直接作废
})

// 导入token.js
import { getToken, saveToken } from './token.js'
// 到入弹出框
import { Toast } from 'vant'
// 导入路由
import router from '@/router/index.js'
// 添加请求拦截器 ：给项目添加默认token
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做什么
    // 应用场景：添加默认请求参数 或 默认请求头（如 token）
    // 不知道用户有没有登录，有登录才传token
    if (getToken()) {
      config.headers.Authorization = `Bearer ${getToken().token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)
// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error) {
    // 对响应错误做点什么
    // 场景：拦截服务器一些错误信息状态码 如401
    if (error.response && error.response.status == 401) {
      //  是401
      // 判断有没有toekn
      if (getToken()) {
        //  2.1有token,说明token过期，处理方式刷新token
        // 这个地方不能使用instance发请求
        // 原因：1.这个刷新接口的参数需要refresh_token,而不是token
        // 2.instance默认会在请求拦截发送token（此时的token已经过期了）
        try {
          let res = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${getToken().refresh_token}`
            }
          })
          console.log(res)
          // 成功刷新token,更新token
          saveToken({
            token: res.data.data.token,
            refresh_token: getToken().refresh_token
          })
        } catch (err) {
          // refresh_token也过期
          Toast.success('请先登录')
          // 跳入登录页
          router.push('/login')
        }
      } else {
        // 2.2 没有token
        Toast.success('请先登录')
        // 跳入登录页
        router.push('/login')
      }
    } else {
    }
    return Promise.reject(error)
  }
)

// 导出接口
export default instance
